package Thread.Synchroized01;

/*
    卖票案例出现了线程安全问题
        卖出了不存在和重复的票

    解决线程安全问题的一种方案：使用同步代码块
    格式：
        synchroized（锁对象）{
            可能会出现安全问题的代码（访问了共享数据的代码）
        }

    注意：
        1、通过代码块中的锁对象，可以使用任意的对象
        2、但是必须保证多个线程使用的是一个对象
        3、锁对象作用：
            把同步代码块锁住，只让一个线程在同步代码块中执行

    同步技术原理：
        使用一个锁对象，也叫同步锁
        多个进程一起抢夺cpu的执行权，当某一个进程得到时，执行到synchroized代码块，发现锁对象，获取锁对象，进入同步执行
        当另外一个进程得到时cpu执行权是，执行到synchroized代码块，没有发现锁对象，进入阻塞状态，会一直等到其他线程归还
        锁对象，才能继续执行

*/
public class Runnable01 implements Runnable {
    //指定票数为100
    private int tickets = 100;

    //创建锁对象
    Object obj = new Object();


    @Override
    public void run() {
        while (tickets > 0) {
            synchronized (obj) {
                if (tickets > 0) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("正在卖地第" + tickets + "张票");
                    tickets--;
                }
            }
        }
    }
}
